package estoquefacil

import grails.test.*

class ProdutoIntegrationTestTests extends GrailsUnitTestCase {
    protected void setUp() {
        super.setUp()
    }

    protected void tearDown() {
        super.tearDown()
    }
	
	void testCodigoUnico() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA333", nome: "Prego de ferro", valorDeCompra: 1.0, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: "AAA333", nome: "Prego de ouro", valorDeCompra: 1.0, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNotNull p1.save()
		assertNull p2.save()
	}

    void testCodigoInvalido() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "", nome: "Prego de papel", valorDeCompra: 1.0, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: null, nome: "Prego de madeira", valorDeCompra: 1.0, descricao: "Deve ser tao ruim qnt o de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p3 = new Produto(codigo: "AAA333", nome: "Prego de ferro", valorDeCompra: 1.0, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNull p1.save()
		assertNull p2.save()
		assertNotNull p3.save()
		
		p3.setCodigo "aaa"
		assertTrue p3.hasErrors()
		
		p3.setCodigo "aaa333"
		assertTrue p3.hasErrors()
		
		p3.setCodigo "aaa333"
		assertTrue p3.hasErrors()
		
		p3.setCodigo "3a3a3"
		assertTrue p3.hasErrors()
		
		p3.setCodigo "BBB222"
		assertFalse p3.hasErrors()
    }
	
	void testNomeVazio() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA111", nome: "", valorDeCompra: 1.0, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: "BBB222", nome: null, valorDeCompra: 1.0, descricao: "Deve ser tao ruim qnt o de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNull p1.save()
		assertNull p2.save()
	}
	
	void testNomeInvalido() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA111", nome: "123", valorDeCompra: 1.0, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: "BBB222", nome: "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", valorDeCompra: 1.0, descricao: "Deve ser tao ruim qnt o de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p3 = new Produto(codigo: "CCC333", nome: "Prego de ferro", valorDeCompra: 1.0, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNull p1.save()
		assertNull p2.save()
		assertNotNull p3.save()
		
		p3.setNome("<4.")
		p3.refresh()
		assertEquals p3.getNome(), "Prego de ferro"
		
		p3.setNome("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") //String de tamanho = 31 > 30
		p3.refresh()
		assertEquals p3.getNome(), "Prego de ferro"
		
		p3.setNome("Prego de chumbo")
		p3.refresh()
		assertEquals p3.getNome(), "Prego de chumbo"
	}
	
	
	void testValorDeCompraInvalido() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA111", nome: "Prego de papel", valorDeCompra: null, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: "BBB222", nome: "Prego de madeira", valorDeCompra: -1.0, descricao: "Deve ser tao ruim qnt o de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p3 = new Produto(codigo: "AAA333", nome: "Prego de ferro", valorDeCompra: 1.000, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p4 = new Produto(codigo: "AAA333", nome: "Prego de ouro", valorDeCompra: 1, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNull p1.save()
		assertNull p2.save()
		assertNull p3.save()
		assertNull p4.save()
	}
	
	void testTaxaDeLucroInvalida() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA111", nome: "Prego de papel", valorDeCompra: 0.00, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p2 = new Produto(codigo: "BBB222", nome: "Prego de madeira", valorDeCompra: 1.0, descricao: "Deve ser tao ruim qnt o de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p3 = new Produto(codigo: "AAA333", nome: "Prego de ferro", valorDeCompra: 4.00, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		Produto p4 = new Produto(codigo: "AAA333", nome: "Prego de ouro", valorDeCompra: 1111.0, descricao: "Esse eh bom",
								 taxaDeLucro: 0.2, dataDeCadastro: now)
		
		assertNull p1.save()
		assertNull p2.save()
		assertNull p3.save()
		assertNull p4.save()
	}
	
	void testDataDeCadastroInvalida() {
		Date now = new Date()
		Produto p1 = new Produto(codigo: "AAA111", nome: "Prego de papel", valorDeCompra: 0.00, descricao: "Nunca vi prego de papel",
								 taxaDeLucro: 0.2, dataDeCadastro: new Date("11/09/2011"))
		
		assertNull p1.save()
	}
	
}
